# 定义生成器: 只需要把列表生成式的 [] 换成 ()
g = (i for i in range(1, 11))
# print(g)
# print(type(g))   # <class 'generator'>
# 生成器生成的数据不能直接输出.要想访问生成器中的数据,必须使用next()遍历,每调用一次next()输出一次数据
'''
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
'''

# 当通过next()函数将生成器中的数据遍历完毕以后,接着再去调用next().会输出StopIteration

# 生成器一般用于生成大量的数据时,  若使用列表的话,会占用大量的空间,影响性能.


# 生成器相关的函数 yield
'''
1.当普通函数中有了yield关键字以后,该函数就变为了生成器函数
2.调用生成器函数,不会直接执行程序.想要执行程序,使用next()



'''


def test(n):
    print("n=", n)  # 12
    yield n * 2  # 24
    print("n*2=", n + 1)
    yield (n + 1) * 2
    print("n+1=", n + 2)


gg = test(12)
# print(type(gg))   # <class 'generator'>
print(next(gg))  # 调用一次next函数,到第一个yield处暂停
print(next(gg))  # 调用二次next函数,到第二个yield处暂停
